Composer+dbtでSAの権限借用(impersonate)を使ってみる
はじめに
データアナリティクス事業本部のkobayashiです。
dbt(dbt core)を Cloud Composer 上で動かしているデータパイプラインがあり、dbt では BigQuery の操作をしている DAG がある場合、Cloud Composer に設定してあるサービスアカウントで直接 BigQuery を操作するのではなく、別の BigQuery 操作用のサービスアカウントを使う方法をまとめます。
- Bigquery Service Account Impersonation | dbt Developer Hub
- サービス アカウントの権限借用の管理 | IAM のドキュメント | Google Cloud
サービス アカウントの権限借用(Impersonate)
今回のように別のサービスアカウントから別のサービスアカウントになりすましてリソースの操作を行う場合には「サービスアカウントの権限借用」を使うことで実現が可能です。これは
- スクリプトやプログラムが特定のサービスアカウントの権限を借用し、必要なリソースにアクセスして処理を自動化する。(作業の自動化)
- システム管理者が個別ユーザーに直接権限を付与するのではなく、サービスアカウントを通じてアクセスを制御する。(権限管理の簡素化)
特定のサービスアカウントに限られた権限を与え、権限の濫用を防ぐ。(セキュリティの向上)
といった場合に使うのが一般的で、今回の用途としてもBigQueryを操作するのは専用のサービスアカウントを用意しておいてComposerにはそのサービスアカウントをアタッチしないといったパターンでも活用できます。
Cloud Composer+dbtで権限借用を設定する
では実際にCloud ComposerとdbtでBigQueryに対する操作で権限借用を設定してみます。設定方法はdbtの公式ページ(Bigquery Service Account Impersonation | dbt Developer Hub )にあるのでこれに従って設定を行えば可能です。
設定は以下の流れで行います。
- 権限を借用するサービスアカウントに対して、Cloud Composerのサービスアカウントがトークン生成を行えるロールを付与する
- dbtのprofile.ymlで接続情報を設定する
トークン生成のロール付与
権限を借用するサービスアカウントに対してadd-iam-policy-bindingを行います。借用するサービスアカウントのトークンを発行できるようにするためroles/iam.serviceAccountTokenCreator
ロールを付与します。
$ gcloud iam service-accounts add-iam-policy-binding {BQを操作するサービスアカウント}@{プロジェクト名}.iam.gserviceaccount.com --member="serviceAccount:{composerのサービスアカウント}@n{プロジェクト名}.iam.gserviceaccount.com" --role="roles/iam.serviceAccountTokenCreator"
bindings:
- members:
- serviceAccount:{composerのサービスアカウント}@n{プロジェクト名}.iam.gserviceaccount.com"
role: roles/iam.serviceAccountTokenCreator
etag: BwYeXOpTbFk=
version: 1
dbtのprofile設定
次にdbtのprofile.ymlで権限を借用するプロファイルを設定します。認証はサービスアカウントの権限借用をするためmethod:oauth
を設定したうえで、impersonate_service_account
に借用するサービスサービスアカウントを設定します。impersonate_service_account
を使用しないとcomposerのサービスアカウントがBigQueryの操作者になってしまうので注意が必要です。
my-profile:
target: dev
outputs:
dev:
type: bigquery
method: oauth
project: abc-123
dataset: my_dataset
impersonate_service_account: {BQを操作するサービスアカウント}@{プロジェクト名}.iam.gserviceaccount.com
まとめ
Cloud Composer+dbtのデータパイプラインで、CLoud Composerに設定してあるサービスアカウントではなく別のBigQuery操作用のサービスアカウントで処理を行う方法をまとめました。特に難しい箇所もなく設定を行うことができました。
最後まで読んで頂いてありがとうございました。